// #include <iostream>
// #include <unistd.h>

// struct A
// {
//     A()
//     {
//         std::cout << "AAA" << std::endl;
//     }
//     int a;
// };

// class Init
// {
//     static A a;
// public:
//     Init(int i)
//     {
//         std::cout << "hello world " << i << std::endl;
//     }

// };

// Init t1(1);
// A Init::a;
// Init t2(2);

// int main()
// {
//     sleep(3);
//     std::cout << "-------------" << std::endl;
//     static Init t3(3);

//     sleep(3);
//     std::cout << "-------------" << std::endl;
//     Init t4(4);

//     return 0;
// }

// template <typename T>
// class Singleton
// {
//     static T data;

// public:
//     static T *GetInstance()
//     {
//         return &data;
//     }
// };

// template <typename T>
// class Singleton
// {
//     static T *inst;

// public:
//     static T *GetInstance()
//     {
//         if (inst == NULL)
//         {
//             inst = new T();
//         }
//         return inst;
//     }
// };

// 懒汉模式, 线程安全
template <typename T>
class Singleton
{
    volatile static T *inst; // 需要设置 volatile 关键字, 否则可能被编译器优化.
    static std::mutex lock;

public:
    static T *GetInstance()
    {
        if (inst == NULL) // 双重判定空指针, 降低锁冲突的概率, 提高性能
        {
            lock.lock(); // 使用互斥锁, 保证多线程情况下也只调用一次 new
            if (inst == NULL)
            {
                inst = new T();
            }
            lock.unlock();
        }
        return inst;
    }
};
